페이지 수정·삭제·rename·파일 첨부 등 콘텐츠를 변경하는 모든 액션이 발생하면 지정한 Telegram 채팅방으로 알림을 보내는 기능.
application.conf (또는 wiki.aha00a.com.conf 등 환경별 conf) 의 AhaWiki.telegram 블록에 Bot Token과 Chat ID를 입력한다. 모든 사이트의 변경 이벤트를 수신한다.
AhaWiki {
telegram {
botToken: "1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ"
chatId: "123456789"
}
}botToken — @BotFather에서 발급받은 Bot Token (전역 공유, 사이트별 설정 없음)chatId — 전체 관리자가 수신할 Chat ID (문자열; 개인은 양수, 그룹·채널은 음수)botToken이 비어있으면 전체 알림 비활성화DB의 Config 테이블에 키 Telegram.chatId로 해당 사이트의 Chat ID를 저장하면, 해당 사이트의 이벤트를 전역 chatId와 함께 사이트별 chatId에도 추가로 전송한다. 같은 Bot Token을 사용한다.
/Admin/Site/:seq/Config → **Telegram** 카드에서 Chat ID 입력 후 Save.distinct 처리)https://api.telegram.org/bot{BOT_TOKEN}/getUpdates 를 호출하여 chat.id 값을 확인이벤트 | 이모지 | 메시지 예시 |
|---|---|---|
페이지 신규 생성 | 🆕 | 🆕 **PageName** created by 닉네임\n코멘트(있을 때만)\nURL |
페이지 수정 | ✏️ | ✏️ **PageName** r5 edited by 닉네임\n코멘트(있을 때만)\ndiff URL |
페이지 삭제 | 🗑️ | 🗑️ **PageName** deleted by 닉네임\nURL |
마지막 리비전 삭제 | ⏪ | ⏪ **PageName** r5 revision deleted by 닉네임\nURL |
페이지 rename | 📝 | 📝 **OldName** → **NewName** renamed by 닉네임\nURL |
파일 첨부 업로드 | 📎 | 📎 **PageName** filename.pdf attached by 닉네임\nURL |
파일 첨부 삭제 | 🗑️📎 | 🗑️📎 **PageName** filename.pdf attachment deleted by 닉네임\nURL |
클립보드 이미지 붙여넣기 | 🖼️ | 🖼️ **PageName** image pasted by 닉네임\nURL |
Google Spreadsheet 동기화 | 🔄 | 🔄 **PageName** spreadsheet synced by 닉네임\nURL |
<b>)로 강조, parse_mode=HTML 사용&, <, >) 이스케이프 처리disable_notification: true 로 전송 (무음)?action=diff&after=r번호), 나머지는 페이지 직접 링크app/logics/ApplicationConf.scala — AhaWiki.telegram.botToken() / chatId() 설정 읽기app/models/tables/Config.scala — Config.Query.Telegram.chatId() / saveChatId() 캡슐화Telegram.chatIdchatId() — 읽기 (Option[String], 미설정 시 None)saveChatId(v) — 쓰기 (비우면 자동 삭제)app/logics/TelegramLogic.scala — 알림 전송 전담 클래스 (@Singleton, DI)sendTo(chatId, message) — 단일 chatId로 Telegram API 호출 (비동기 fire-and-forget)send(message, siteChatId) — 전역 chatId + 사이트별 chatId를 deduplicate하여 sendTo 호출pageUrl / diffUrl / h / b / commentLine — 내부 유틸 (diffUrl은 pageUrl + ?action=diff&after=revision)siteChatId: Option[String] = None 파라미터 보유app/controllers/Wiki.scalaTelegramLogic 주입siteTelegramChatId(implicit connection, site) — Config.Query.Telegram.chatId()로 사이트별 chatId 조회save, delete, deleteLastRevision, rename, uploadAttachment, deleteAttachment, uploadClipboardImage, syncGoogleSpreadsheet)에서 성공 시 siteTelegramChatId를 함께 전달app/controllers/Diary.scalaTelegramLogic 주입write 핸들러: 신규 페이지면 notifyPageCreated, 기존 페이지 append면 notifyPageEdited 호출app/controllers/Api.scalaGET /api/Admin/Site/:seq/Telegram — chatId 조회PUT /api/Admin/Site/:seq/Telegram — chatId 저장 (Config.Query.Telegram.saveChatId)wsClient.url(...).post(...).foreach(...) 방식으로 결과를 기다리지 않으므로, Telegram API 지연·오류가 페이지 저장 응답에 영향을 주지 않는다. 전송 실패 시 logger.warn 으로만 기록한다.
Similar pages by cosine similarity. Words after page name are term frequency.